
/*
 * TacticaBertrix.java
 *
 * Created on 13 de marzo de 2007, 15:50
 *
 * To change this template, choose Tools | Template Manager
 * and open the template in the editor.
 */

/**
 *
 * @author Sergio
 */
package futbol.tacticas.concursantes2007.BertriXUnited;

import futbol.Bola;
import futbol.General;
import futbol.tacticas.concursantes.Tactica;

import java.awt.*;
import java.util.Vector;
import futbol.tacticas.*;
import java.util.Random;
/**
 *
 * @author Administrador
 */
public class BertrixUltimate implements Tactica{
    
    private int nValores2[][]={
        {-150,0,4},  // Jugador 1[0]
        {-110,80,2},  // Jugador 2[1]
        {-110,-20,6},  // Jugador 3[2]
        {-110,20,5},  // Jugador 4[3]
        {-110,-80,2},  // Jugador 5[4]
        {0,-50,5},  // Jugador 6[5]
        {90,-20,7},  // Jugador 7[6]
        {10,50,6},  // Jugador 8[7]
        {70,-80,7},  // Jugador 9[8]
        {100,20,7},  // Jugador 10[9]
        {70,80,7}  // Jugador 11[10]
    };
    
    private int nValores[][]={
        {-150,0,4},  // Jugador 1[0]
        {-120,80,4},  // Jugador 2[1]
        {-100,-20,6},  // Jugador 3[2]
        {-100,20,5},  // Jugador 4[3]
        {-120,-80,4},  // Jugador 5[4]
        {-50,-50,5},  // Jugador 6[5]
        {90,-20,7},  // Jugador 7[6]
        {0,10,6},  // Jugador 8[7]
        {22,-80,7},  // Jugador 9[8]
        {100,20,6},  // Jugador 10[9]
        {22,80,7}  // Jugador 11[10]
    };
    
    public Color getColor1() {
         return new Color(73,0,147);
    }

    public Color getColor2() {
        return new Color(73,0,147);
    }

    public Color getColorNumero() {
        return new Color(252,130,18);
    }

    public String getNombre() {
        return "BertriX United";
    }

    public int getXInicial(int n) {
        return nValores[n][0];
    }

    public int getYInicial(int n) {
        return nValores[n][1];
    }

    public int getFuerza(int n) {
        return nValores[n][2];
    }

    
    private int heuristica(SituacionJugadores sj, int NJugDa,int NJugRecibe){
        int Heu = 0;
     
        Point contrarios[]=sj.getContrario();
        Point jugadores[]=sj.getMisJugadores();
         
        int contrarioCercano = sj.getContrarioMasCerca(getXInicial(NJugRecibe), getYInicial(NJugRecibe));
        
        int nDisC = (int) (General.getDistancia(jugadores[NJugRecibe].getX(), jugadores[NJugRecibe].getY()
                            ,contrarios[contrarioCercano].getX(), contrarios[contrarioCercano].getY()));
        Heu += nDisC * 100;
        
        
       
        int nDisJ = (int) (General.getDistancia(jugadores[NJugDa].getX(), jugadores[NJugDa].getY()
                            ,jugadores[NJugRecibe].getX(), jugadores[NJugRecibe].getY()));
        
        Heu -= nDisJ * 20;
        
        return Heu;
    }
    
    private int aQuienPasar(SituacionJugadores sj, int Njug){
        Point jugadores[]=sj.getMisJugadores();
        int valorHeu = 0;
        int valorHeuAux = 0;
        int decision = -1;
        
        for(int n=1;n<11;n++){
            
            if((n!=Njug) && (jugadores[n].getX() >= jugadores[Njug].getX())){
                valorHeuAux = heuristica(sj,Njug,n);
                if (valorHeuAux > valorHeu){
                    valorHeu = valorHeuAux;
                    decision = n;
                }
                
            }
        }
        return decision;
    }
    

    public Vector<Comando> getComandos(SituacionJugadores sj) {
       
        Vector<Comando> com=new Vector();
        Random random= new Random();
        //Posicionamiento
        for (int n=0;n<11;n++)
            com.add(new ComandoIrA(n,nValores[n][0],nValores[n][1]));

        Point bola=sj.getBola();
        
       
        
        Point jugadores[]=sj.getMisJugadores();
        Point contrarios[]=sj.getContrario();
        
        //Movimiento portero
        int y=(int)(bola.getY()/2);
        if (y<-20){
            if (y<-50) y=-25; else y=-20;
        }
        if (y>20){
             if (y>50) y=25; else y=20;
        }
        
       
        com.add(new ComandoIrA(0,nValores[0][0], y));
        
     
        //Mejorar defensa
        
        
        if(!sj.estoyMasCercaDeBola() && bola.getX() < 0) {
            com.add(new ComandoIrA(6,bola.getX(), bola.getY()));
            if(bola.getY() > 30) com.add(new ComandoIrA(4,bola.getX(), bola.getY()));
            if(bola.getY() < -30) com.add(new ComandoIrA(1,bola.getX(), bola.getY()));
        }
        
        
        /*if (!sj.estoyMasCercaDeBola() || bola.getX()< -90){
            for (int n=1;n<4;n++){
                int nJC=sj.getContrarioMasCerca(getXInicial(n), getYInicial(n));
                com.add(new ComandoIrA(n, contrarios[nJC].getX()+10, contrarios[nJC].getY()));
            }
        }*/
        
        
        //ESTO ES LO Q ESTABA ANTES
        /*
         if (!sj.estoyMasCercaDeBola() || bola.getX()< -90){
            for (int n=1;n<4;n++){
                int nJC=sj.getContrarioMasCerca(getXInicial(n), getYInicial(n));
                com.add(new ComandoIrA(n, contrarios[nJC].getX()+10, contrarios[nJC].getY()));
            }
        }*/
        
        if(!sj.estoyMasCercaDeBola()){
             double diffX = 0;
             double diffY = 0;
             int DIST = 10;
             int CMARCADO =10;
             int distanciaJC = 0;
             boolean[] marcado = new boolean[11];
             int[]  estanMarcados = new int[11];
             
             for(int i=0;i<11;i++){
                 marcado[i] = false;
                 estanMarcados[i] = -1;
             }
             int nJC = 10;
             
             
             
            for(int n=1;n<11;n++){
                int dev1[] = sj.getInfoMasCercano(contrarios, jugadores[n], estanMarcados, false);
                nJC = dev1[0];
                
                if(!marcado[nJC]){
                    marcado[nJC] = true;
                    estanMarcados[nJC] = nJC;
                }
                else {
                     while ( marcado[nJC] == true){
                        dev1 = sj.getInfoMasCercano(contrarios, jugadores[n], estanMarcados, false);
                        nJC = dev1[0];
                     }
                     marcado[nJC] = true;
                     estanMarcados[nJC] = nJC;
                }
             
                //diffX = contrarios[11-n].getX() - bola.getX();
                //diffY = contrarios[11-n].getY() - bola.getY();
                
                //HAY Q MARCAR AL JUGADOR Q TOCA SI ESTA CERCA
                
               
                CMARCADO = nJC;
                distanciaJC = (int) (General.getDistancia(jugadores[n].getX(), jugadores[n].getY()
                            ,bola.getX(), bola.getY()));
                if (distanciaJC < 60){
                    diffX = contrarios[CMARCADO].getX() - bola.getX();
                    diffY = contrarios[CMARCADO].getY() - bola.getY();
            
                    if(diffX >= 0){
                        if(diffY >= 0){
                            com.add(new ComandoIrA(n, contrarios[CMARCADO].getX()-DIST, contrarios[CMARCADO].getY()-DIST));
                        }else{
                            com.add(new ComandoIrA(n, contrarios[CMARCADO].getX()-DIST, contrarios[CMARCADO].getY()+DIST));
                        }
                    }else{
                        if(diffY >= 0){
                            com.add(new ComandoIrA(n, contrarios[CMARCADO].getX()+DIST, contrarios[CMARCADO].getY()-DIST));
                        }else{
                            com.add(new ComandoIrA(n, contrarios[CMARCADO].getX()+DIST, contrarios[CMARCADO].getY()+DIST));
                        }
                    }
                }
                
            }
        }
        
       
        
        /*
        if(bola.getX() < 0){
            for(int n=1;n<10;n++){
                if (jugadores[n].getX() < 0){
                    int nJC=sj.getContrarioMasCerca(getXInicial(n), getYInicial(n));
                com.add(new ComandoIrA(n, contrarios[nJC].getX()+10, contrarios[nJC].getY()));
                }
                
            }
        }*/
        
        if (bola.getY() < 0 && bola.getX() > -70 && bola.getX() < 30) com.add(new ComandoIrA(5,bola.getX(), bola.getY()));
        if (bola.getY() > 0 && bola.getX() > -70 && bola.getX() < 30) com.add(new ComandoIrA(7,bola.getX(), bola.getY()));
        
        

        //Movimiento mas cercano a la bola
        int nJug=sj.getMasCercanoDeBola();
        com.add(new ComandoIrA(nJug,bola.getX(), bola.getY()));
        
        
        
        int dis = 0;
        
        
        for(int n=1;n<11;n++){
            dis = (int) (General.getDistancia(jugadores[n].getX(), jugadores[n].getY()
                            ,bola.getX(), bola.getY()));
            if (dis < 50) com.add(new ComandoIrA(n,bola.getX(), bola.getY()));
        }
        
        
        
        
        
        int destino = aQuienPasar(sj,nJug);
        if (destino == -1) destino = sj.getMiJugadorMasCerca(jugadores[nJug].getX(),jugadores[nJug].getY());
        if(bola.getX() < -70){
            if(bola.getY() > 0) destino = 10;
            else destino = 8;
        }
  
        
        dis = (int) (General.getDistancia(jugadores[nJug].getX(), jugadores[nJug].getY()
                            ,jugadores[destino].getX(), jugadores[destino].getY()));
        if (dis < 4) {
            com.add(new ComandoTiroAPuerta(nJug,0));
            destino = 10;
        }
        
        //System.out.println("destino del pase: "+ (destino+1));
        
        
            switch(nJug){
                case 0: 
                        if(jugadores[nJug].getY() > 0) com.add(new ComandoPase(nJug,1));
                        else if (jugadores[nJug].getY() < 0) com.add(new ComandoPase(nJug,4));
                        //com.add(new ComandoPase(nJug,destino));
                        break;
                case 1: 
                        com.add(new ComandoPase(nJug,destino));
                        break;
                case 2: com.add(new ComandoPase(nJug,destino));
                        break;
                case 3: com.add(new ComandoPase(nJug,destino));
                        break;
                case 4: com.add(new ComandoPase(nJug,destino));
                        break;
                case 5: com.add(new ComandoPase(nJug,destino));
                    
                        //if (random.nextBoolean()) com.add(new ComandoPase(nJug,8));
                        //else com.add(new ComandoPase(nJug,9));
                        break;
                    
                case 6: com.add(new ComandoTiroAPuerta(nJug,0));
                        break;
                case 7: if (bola.getX() > 80) com.add(new ComandoTiroAPuerta(nJug,0));
                        else com.add(new ComandoPase(nJug,destino));
                    
                        //if (random.nextBoolean()) com.add(new ComandoPase(nJug,10));
                        //else com.add(new ComandoPase(nJug,9));
                        break;
                case 8: if (bola.getX() < 10) com.add(new ComandoPase(nJug,destino));
                        else com.add(new ComandoTiroAPuerta(nJug,0));
                    
                        /*if (bola.getX() > 60){
                            if(bola.getY() > -110 && bola.getX() < 140)
                                com.add(new ComandoTiroAPuerta(nJug,0));
                            else
                                com.add(new ComandoPase(nJug,9));
                        }
                        else com.add(new ComandoPase(nJug,destino));*/
                
                        break;
                case 9: if (bola.getX() > 60) com.add(new ComandoTiroAPuerta(nJug,0));
                        else com.add(new ComandoPase(nJug,destino));
                        break;
                case 10:if (bola.getX() < 10) com.add(new ComandoPase(nJug,8));
                        else com.add(new ComandoTiroAPuerta(nJug,0));
                        /*if (bola.getX() > 60){
                            if(bola.getY() < 110 && bola.getX() < 140)
                                com.add(new ComandoTiroAPuerta(nJug,0));
                            else
                                com.add(new ComandoPase(nJug,9));
                        }
                        else com.add(new ComandoPase(nJug,6));*/
                
                        break;
            }
                
        
        
        return com;
    }
    
}
